package zhaoqiang.mediarecoder;

import android.app.Activity;
import android.graphics.ImageFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Surface;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.util.List;


/**
 *自定义拍照功能  使用android.hardWare.Camera类
 */
public class CameraActivity extends Activity implements SurfaceHolder.Callback, Camera.PictureCallback, Camera.PreviewCallback {


    private Camera camera;//照相机的api

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_camera);

        //获取 SurfaceView
        SurfaceView preView  = (SurfaceView) findViewById(R.id.surfaceview);

        //2，要想使用SurfaceView就需要用到：SurfaceHolder、
        //获取surface内部 获取可绘制对象 ，通过该对象  绘制
        SurfaceHolder holder = preView.getHolder();

        //设置  回调方法  SurfaceView会有一些状态变化
        // 当surfaceView准备好绘制的时候  回调方法
        holder.addCallback(this);

    }

    /**
     * 拍照的点击事件
     */
   public void btnTakePicture(View view){

       if (camera != null) {

           //拍照
           camera.takePicture(
                   null,//快门回调  当图片处理完  回调这个接口
                   null,//raw模式  数据回调、
                   null,
                   this//PictureCallBack   对应JPEG模式的数据
           );

       }

   }


    /**
     * 当surfaceView准备好 从屏幕上画出一块区域，作为surFace的时候
     * 回调这个方法   代表了  可以在这个方法以及以后进行绘制
     * @param holder
     */
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //准备Camera
        camera = Camera.open();//创建一个新的照相机对象  来访为后置摄像头  否则返回空

        if (camera != null) {
            try {
                //2.1 设置预览的界面  通过surfaceHolder 绘制SurfaceView
                camera.setPreviewDisplay(holder);

                //设置预览的模式
//                camera.setDisplayOrientation(90);//设置方向

                //获取当前照相机的参数信息   可以直接修改  立即生效
                Camera.Parameters parameters = camera.getParameters();


                ///获取支持的颜色效果：
                List<String> effects = parameters.getSupportedColorEffects();

                if (effects != null){

                    for (String effect : effects){

                        Log.i("info",effect+"==============");

                    }

                }

                //设置图片质量 1-100 质量区间
                parameters.setJpegQuality(100);

                //
                parameters.setPictureSize(500, 400);

                //设置当前图像 旋转
                parameters.setRotation(90);

                //
                parameters.setColorEffect(Camera.Parameters.EFFECT_NEGATIVE);

                //设置拍照图片像素存储的格式  对于
                // camera.takePicture  有影响
                parameters.setPictureFormat(ImageFormat.NV16);

                //开启闪关灯：
                parameters.setFlashMode(Camera.Parameters.FLASH_MODE_ON);

                camera.setParameters(parameters);

                //设置预览回调：
                camera.setPreviewCallback(this);

               //2.2  开始预览
                camera.startPreview();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    /**
     * 当SurfaceView不在使用，内部的屏幕区域就要销毁
     * 此时不能在进行任何绘制
     * @param holder
     */
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

        if (camera != null) {

            try {

                camera.stopPreview();

            }catch (Exception e){

            }
            //释放摄像头  避免占用  导致其他程序不能使用摄像头
            camera.release();
        }
    }

    /**
     * pictureCallBack 的回调方法  用于接收数据
     * @param data  对于jpeg
     * @param camera
     */
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {

        File imageFile = FileUtils.getImageFile(this);

        try {
            FileOutputStream fount = new FileOutputStream(imageFile);
            fount.write(data);

            fount.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //因为takePicture()  调用之后 预览就停止了  那么需要再次执行。
        camera.startPreview();
    }


    /**
     * 预览中  刷新一帧  回调一次  把预览的内容存成data数据  传给
     * @param data
     * @param camera
     */
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {

    }
}
